The R markdown is available from the pulldown menu for Code at the upper-right, choose “Download Rmd”, or download the Rmd from GitHub.


scNetViz is a Cytoscape app designed to support the biological interpretation of scRNAseq experiments. This notebook describes the automation of the scNetViz app using the RCy3 package via two use cases.

Setup

The following use cases require installation of Cytoscape, the scNetViz app and RCy3 library. Download the latest http://www.cytoscape.org/download.php and load RCy3 package:

if(!"RCy3" %in% installed.packages()){
    install.packages("BiocManager")
    BiocManager::install("RCy3")
}
library(RCy3)

Launch Cytoscape and keep it running whenever using RCy3. Confirm that you have everything installed and that RCy3 is communicating with Cytoscape:

 cytoscapePing ()

Install the scNetViz and stringApp Cytoscape apps:

installApp('STRINGapp')  
installApp('scNetViz')

Use Case 1

In this example, we will browse a single cell expression atlas from within Cytoscape, explore a particular dataset, perform differential expression analysis based on provided categories, generate networks from the top genes from each category, and functionally characterize and visualize the networks.

Load data

This loads the data and opens an experiment table with three tabs, named TPM, Categories and DiffExp. We are going to load the dataset with Accession number E-MTAB-5553:

RCy3::commandsRun('scnetviz load gxa experiment accession=E-MTAB-5553')

Calculate Differential Expression

We will calculate differential expression for K=4 cluster:

RCy3::commandsRun('scnetviz calculate diffexp accession=E-MTAB-5553')

Create Networks

Fetch protein networks for each cluster. There should be four networks - one each for each cluster and one for all the clusters collectively. We will also collect a list of network names for downstream steps.

RCy3::commandsRun('scnetviz create network accession=E-MTAB-5553')
networks <- getNetworkList()

Alternative: Calculate Differential Expression and Create Networks

This is a one-step alternative which replaces the two steps above.

RCy3::commandsRun('scnetviz create all experiment=E-MTAB-5553')

Functional Enrichment Analysis

For each of the networks, we can now calculate functional enrichment using the stringApp. Each network is first “stringified” to enable the retrieval of functional enrichment:

lapply(networks, function (x){
  setCurrentNetwork(x)
  print(x)
  RCy3::commandsRun('string retrieve enrichment allNetSpecies=Mus musculus')
  RCy3::commandsRun('string show charts')
})
[1] "Cluster 4"
[1] "Cluster 2"
[1] "Cluster 1"
[[1]]
character(0)

[[2]]
character(0)

[[3]]
character(0)

Use Case 2

In this example, we will import normalized scRNA-seq data and cluster assignments from local files, generate cell plots, perform differential expression analysis based on provided categories, visualize as a combined heatmap and generate networks from the top genes from each category.

Load data from file

This notebook downloads and exports files to the same directory as this copy of the Rmd file:

workingDir <- getwd()
url <- "https://raw.githubusercontent.com/cytoscape/cytoscape-automation/master/for-scripters/R/notebooks/scNetViz/RCy3_ExampleData/data/E-MTAB-5553-data/E-MTAB-5553-normalised-files.zip"

path <- file.path(workingDir, "E-MTAB-5553-normalised-files.zip")
download.file(url, path)
trying URL 'https://raw.githubusercontent.com/cytoscape/cytoscape-automation/master/for-scripters/R/notebooks/scNetViz/RCy3_ExampleData/data/E-MTAB-5553-data/E-MTAB-5553-normalised-files.zip'
cannot open URL 'https://raw.githubusercontent.com/cytoscape/cytoscape-automation/master/for-scripters/R/notebooks/scNetViz/RCy3_ExampleData/data/E-MTAB-5553-data/E-MTAB-5553-normalised-files.zip': HTTP status was '404 Not Found'Error in download.file(url, path) : 
  cannot open URL 'https://raw.githubusercontent.com/cytoscape/cytoscape-automation/master/for-scripters/R/notebooks/scNetViz/RCy3_ExampleData/data/E-MTAB-5553-data/E-MTAB-5553-normalised-files.zip'

Load the category data

completeFilePath <- file.path(workingDir, "E-MTAB-5553-data/E-MTAB-5553.clusters.tsv")
commandToAddCategory <- paste0('scnetviz add file category file=',completeFilePath)
RCy3::commandsRun(commandToAddCategory)
# RCy3::commandsRun('scnetviz add file category file=/Users/krishna.choudhary/Dropbox (Gladstone)/GR-scNetViz/E-MTAB-5553-data/E-MTAB-5553.clusters.tsv')

Generate a UMAP plot

#No plot displayed. ??
RCy3::commandsRun('scnetviz calculate UMAP scale=true')
[1] "D@17a1c43"

Perform differential expression analysis

RCy3::commandsRun('scnetviz calculate diffexp')
[1] "Available arguments for 'scnetviz calculate diffexp':"
#RCy3::commandsRun('scnetviz calculate diffexp accession=E-MTAB-5553 categoryRow=3')

Generate heatmap

Generate a heatmap showing the top differentially expressed genes:

RCy3::commandsRun('scnetviz ??')

Fetch protein networks

RCy3::commandsRun('scnetviz create network accession=E-MTAB-5553')
LS0tCnRpdGxlOiAic2NOZXRWaXogVXNlIENhc2VzIgphdXRob3I6ICJLcmlzaG5hIENob3VkaGFyeSwgS3Jpc3RpbmEgSGFuc3BlcnMiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IG5vbmUKICAgIHRvY19mbG9hdDogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZApwYWNrYWdlOiBSQ3kzCi0tLQpgYGB7ciwgZWNobyA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZXZhbD1GQUxTRQopCmBgYAoqVGhlIFIgbWFya2Rvd24gaXMgYXZhaWxhYmxlIGZyb20gdGhlIHB1bGxkb3duIG1lbnUgZm9yKiBDb2RlICphdCB0aGUgdXBwZXItcmlnaHQsIGNob29zZSAiRG93bmxvYWQgUm1kIiwgb3IgW2Rvd25sb2FkIHRoZSBSbWQgZnJvbSBHaXRIdWJdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9jeXRvc2NhcGUvY3l0b3NjYXBlLWF1dG9tYXRpb24vbWFzdGVyL2Zvci1zY3JpcHRlcnMvUi9ub3RlYm9va3Mvc2NOZXRWaXotVXNlLUNhc2VzLlJtZCkuKgoKPGhyIC8+CnNjTmV0Vml6IGlzIGEgQ3l0b3NjYXBlIGFwcCBkZXNpZ25lZCB0byBzdXBwb3J0IHRoZSBiaW9sb2dpY2FsIGludGVycHJldGF0aW9uIG9mIHNjUk5Bc2VxIGV4cGVyaW1lbnRzLiBUaGlzIG5vdGVib29rIGRlc2NyaWJlcyB0aGUgYXV0b21hdGlvbiBvZiB0aGUgc2NOZXRWaXogYXBwIHVzaW5nIHRoZSBSQ3kzIHBhY2thZ2UgdmlhIHR3byB1c2UgY2FzZXMuCgojIFNldHVwCgpUaGUgZm9sbG93aW5nIHVzZSBjYXNlcyByZXF1aXJlIGluc3RhbGxhdGlvbiBvZiBDeXRvc2NhcGUsIHRoZSBzY05ldFZpeiBhcHAgYW5kIFJDeTMgbGlicmFyeS4gRG93bmxvYWQgdGhlIGxhdGVzdCBbaHR0cDovL3d3dy5jeXRvc2NhcGUub3JnL2Rvd25sb2FkLnBocF0oQ3l0b3NjYXBlKSBhbmQgbG9hZCBSQ3kzIHBhY2thZ2U6IApgYGB7cn0KaWYoISJSQ3kzIiAlaW4lIGluc3RhbGxlZC5wYWNrYWdlcygpKXsKICAgIGluc3RhbGwucGFja2FnZXMoIkJpb2NNYW5hZ2VyIikKICAgIEJpb2NNYW5hZ2VyOjppbnN0YWxsKCJSQ3kzIikKfQpsaWJyYXJ5KFJDeTMpCmBgYAoKTGF1bmNoIEN5dG9zY2FwZSBhbmQga2VlcCBpdCBydW5uaW5nIHdoZW5ldmVyIHVzaW5nIFJDeTMuIENvbmZpcm0gdGhhdCB5b3UgaGF2ZSBldmVyeXRoaW5nIGluc3RhbGxlZCBhbmQgdGhhdCBSQ3kzIGlzIGNvbW11bmljYXRpbmcgd2l0aCBDeXRvc2NhcGU6CmBgYHtyIGV2YWw9RkFMU0V9CiBjeXRvc2NhcGVQaW5nICgpCmBgYAoKSW5zdGFsbCB0aGUgc2NOZXRWaXogYW5kIHN0cmluZ0FwcCBDeXRvc2NhcGUgYXBwczoKYGBge3J9Cmluc3RhbGxBcHAoJ1NUUklOR2FwcCcpICAKaW5zdGFsbEFwcCgnc2NOZXRWaXonKQpgYGAKCiMgVXNlIENhc2UgMQpJbiB0aGlzIGV4YW1wbGUsIHdlIHdpbGwgYnJvd3NlIGEgc2luZ2xlIGNlbGwgZXhwcmVzc2lvbiBhdGxhcyBmcm9tIHdpdGhpbiBDeXRvc2NhcGUsIGV4cGxvcmUgYSBwYXJ0aWN1bGFyIGRhdGFzZXQsIHBlcmZvcm0gZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzaXMgYmFzZWQgb24gcHJvdmlkZWQgY2F0ZWdvcmllcywgZ2VuZXJhdGUgbmV0d29ya3MgZnJvbSB0aGUgdG9wIGdlbmVzIGZyb20gZWFjaCBjYXRlZ29yeSwgYW5kIGZ1bmN0aW9uYWxseSBjaGFyYWN0ZXJpemUgYW5kIHZpc3VhbGl6ZSB0aGUgbmV0d29ya3MuIAoKIyMgTG9hZCBkYXRhClRoaXMgbG9hZHMgdGhlIGRhdGEgYW5kIG9wZW5zIGFuIGV4cGVyaW1lbnQgdGFibGUgd2l0aCB0aHJlZSB0YWJzLCBuYW1lZCBUUE0sIENhdGVnb3JpZXMgYW5kIERpZmZFeHAuIFdlIGFyZSBnb2luZyB0byBsb2FkIHRoZSBkYXRhc2V0IHdpdGggQWNjZXNzaW9uIG51bWJlciBFLU1UQUItNTU1MzoKYGBge3J9ClJDeTM6OmNvbW1hbmRzUnVuKCdzY25ldHZpeiBsb2FkIGd4YSBleHBlcmltZW50IGFjY2Vzc2lvbj1FLU1UQUItNTU1MycpCmBgYAoKIyMgQ2FsY3VsYXRlIERpZmZlcmVudGlhbCBFeHByZXNzaW9uCldlIHdpbGwgY2FsY3VsYXRlIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGZvciBLPTQgY2x1c3RlcjogCmBgYHtyfQpSQ3kzOjpjb21tYW5kc1J1bignc2NuZXR2aXogY2FsY3VsYXRlIGRpZmZleHAgYWNjZXNzaW9uPUUtTVRBQi01NTUzJykKYGBgCgojIyBDcmVhdGUgTmV0d29ya3MKRmV0Y2ggcHJvdGVpbiBuZXR3b3JrcyBmb3IgZWFjaCBjbHVzdGVyLiBUaGVyZSBzaG91bGQgYmUgZm91ciBuZXR3b3JrcyAtIG9uZSBlYWNoIGZvciBlYWNoIGNsdXN0ZXIgYW5kIG9uZSBmb3IgYWxsIHRoZSBjbHVzdGVycyBjb2xsZWN0aXZlbHkuIFdlIHdpbGwgYWxzbyBjb2xsZWN0IGEgbGlzdCBvZiBuZXR3b3JrIG5hbWVzIGZvciBkb3duc3RyZWFtIHN0ZXBzLiAKYGBge3J9ClJDeTM6OmNvbW1hbmRzUnVuKCdzY25ldHZpeiBjcmVhdGUgbmV0d29yayBhY2Nlc3Npb249RS1NVEFCLTU1NTMnKQpuZXR3b3JrcyA8LSBnZXROZXR3b3JrTGlzdCgpCmBgYAoKIyMgQWx0ZXJuYXRpdmU6IENhbGN1bGF0ZSBEaWZmZXJlbnRpYWwgRXhwcmVzc2lvbiBhbmQgQ3JlYXRlIE5ldHdvcmtzClRoaXMgaXMgYSBvbmUtc3RlcCBhbHRlcm5hdGl2ZSB3aGljaCByZXBsYWNlcyB0aGUgdHdvIHN0ZXBzIGFib3ZlLgpgYGB7cn0KUkN5Mzo6Y29tbWFuZHNSdW4oJ3NjbmV0dml6IGNyZWF0ZSBhbGwgZXhwZXJpbWVudD1FLU1UQUItNTU1MycpCmBgYAoKIyMgRnVuY3Rpb25hbCBFbnJpY2htZW50IEFuYWx5c2lzCkZvciBlYWNoIG9mIHRoZSBuZXR3b3Jrcywgd2UgY2FuIG5vdyBjYWxjdWxhdGUgZnVuY3Rpb25hbCBlbnJpY2htZW50IHVzaW5nIHRoZSBzdHJpbmdBcHAuIEVhY2ggbmV0d29yayBpcyBmaXJzdCAic3RyaW5naWZpZWQiIHRvIGVuYWJsZSB0aGUgcmV0cmlldmFsIG9mIGZ1bmN0aW9uYWwgZW5yaWNobWVudDogCmBgYHtyfQpsYXBwbHkobmV0d29ya3MsIGZ1bmN0aW9uICh4KXsKICBzZXRDdXJyZW50TmV0d29yayh4KQogIHByaW50KHgpCiAgUkN5Mzo6Y29tbWFuZHNSdW4oJ3N0cmluZyByZXRyaWV2ZSBlbnJpY2htZW50IGFsbE5ldFNwZWNpZXM9TXVzIG11c2N1bHVzJykKICBSQ3kzOjpjb21tYW5kc1J1bignc3RyaW5nIHNob3cgZW5yaWNobWVudCcpCiAgUkN5Mzo6Y29tbWFuZHNSdW4oJ3N0cmluZyBzaG93IGNoYXJ0cycpCn0pCmBgYAoKIyBVc2UgQ2FzZSAyCgpJbiB0aGlzIGV4YW1wbGUsIHdlIHdpbGwgaW1wb3J0IG5vcm1hbGl6ZWQgc2NSTkEtc2VxIGRhdGEgYW5kIGNsdXN0ZXIgYXNzaWdubWVudHMgZnJvbSBsb2NhbCBmaWxlcywgZ2VuZXJhdGUgY2VsbCBwbG90cywgcGVyZm9ybSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcyBiYXNlZCBvbiBwcm92aWRlZCBjYXRlZ29yaWVzLCB2aXN1YWxpemUgYXMgYSBjb21iaW5lZCBoZWF0bWFwIGFuZCBnZW5lcmF0ZSBuZXR3b3JrcyBmcm9tIHRoZSB0b3AgZ2VuZXMgZnJvbSBlYWNoIGNhdGVnb3J5LgoKIyMgTG9hZCBkYXRhIGZyb20gZmlsZQoKVGhpcyBub3RlYm9vayBkb3dubG9hZHMgYW5kIGV4cG9ydHMgZmlsZXMgdG8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoaXMgY29weSBvZiB0aGUgUm1kIGZpbGU6CmBgYHtyIGV2YWw9RkFMU0V9CndvcmtpbmdEaXIgPC0gZ2V0d2QoKQpgYGAKCmBgYHtyfQp1cmwgPC0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9jeXRvc2NhcGUvY3l0b3NjYXBlLWF1dG9tYXRpb24vbWFzdGVyL2Zvci1zY3JpcHRlcnMvUi9ub3RlYm9va3Mvc2NOZXRWaXovRS1NVEFCLTU1NTMtbm9ybWFsaXNlZC1maWxlcy56aXAiCgpwYXRoIDwtIGZpbGUucGF0aCh3b3JraW5nRGlyLCAiRS1NVEFCLTU1NTMtbm9ybWFsaXNlZC1maWxlcy56aXAiKQpkb3dubG9hZC5maWxlKHVybCwgcGF0aCkKdW56aXAocGF0aCwgb3ZlcndyaXRlPVQsIGV4ZGlyPSJFLU1UQUItNTU1MyIpCgpjb21wbGV0ZUZpbGVQYXRoIDwtIGZpbGUucGF0aCh3b3JraW5nRGlyLCJFLU1UQUItNTU1MyIpCgpjb21tYW5kVG9Mb2FkRmlsZSA8LSBwYXN0ZTAoJ3NjbmV0dml6IGxvYWQgZXhwZXJpbWVudCBmaWxlIGZpbGU9JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlRmlsZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIHNwZWNpZXM9TXVzIG11c2N1bHVzJykKUkN5Mzo6Y29tbWFuZHNSdW4oY29tbWFuZFRvTG9hZEZpbGUpCmBgYAoKIyMgTG9hZCB0aGUgY2F0ZWdvcnkgZGF0YQpgYGB7cn0KY29tcGxldGVGaWxlUGF0aCA8LSBmaWxlLnBhdGgod29ya2luZ0RpciwgIkUtTVRBQi01NTUzLWRhdGEvRS1NVEFCLTU1NTMuY2x1c3RlcnMudHN2IikKY29tbWFuZFRvQWRkQ2F0ZWdvcnkgPC0gcGFzdGUwKCdzY25ldHZpeiBhZGQgZmlsZSBjYXRlZ29yeSBmaWxlPScsY29tcGxldGVGaWxlUGF0aCkKUkN5Mzo6Y29tbWFuZHNSdW4oY29tbWFuZFRvQWRkQ2F0ZWdvcnkpCmBgYAoKIyMgR2VuZXJhdGUgYSBVTUFQIHBsb3QKYGBge3J9ClJDeTM6OmNvbW1hbmRzUnVuKCdzY25ldHZpeiBjYWxjdWxhdGUgVU1BUCBzY2FsZT10cnVlJykKYGBgCgojIyBQZXJmb3JtIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2lzCmBgYHtyfQpSQ3kzOjpjb21tYW5kc1J1bignc2NuZXR2aXogY2FsY3VsYXRlIGRpZmZleHAgYWNjZXNzaW9uPUUtTVRBQi01NTUzIGNhdGVnb3J5Um93PTMnKQpgYGAKCiMjIEdlbmVyYXRlIGhlYXRtYXAKR2VuZXJhdGUgYSBoZWF0bWFwIHNob3dpbmcgdGhlIHRvcCBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXM6CmBgYHtyfQpSQ3kzOjpjb21tYW5kc1J1bignc2NuZXR2aXogPz8nKQpgYGAKCiMjIEZldGNoIHByb3RlaW4gbmV0d29ya3MKYGBge3J9ClJDeTM6OmNvbW1hbmRzUnVuKCdzY25ldHZpeiBjcmVhdGUgbmV0d29yayBhY2Nlc3Npb249RS1NVEFCLTU1NTMnKQpgYGAKCgoKCgoK